#include"Stack.h"

//栈的初始化
void STInit(ST* ps)
{
    assert(ps);
    ps->arr = NULL;
    ps->top = ps->capacity = 0;
}
//栈的打印（虚假的栈打印）
void STPrint(ST* ps)
{
    assert(ps);
    for (int i = 0; i < ps->top; ++i) {
        printf("%d ",ps->arr[i]);
    }
    printf("\n");
}
//销毁
void STDestroy(ST* ps)
{
    assert(ps);
    if (ps->arr)
    {
        free(ps->arr);
    }
    ps->arr = NULL;
    ps->top = ps->capacity = 0;
}
//判断空间是否足够函数
void CheckCapacity(ST* ps)
{
    if (ps->top == ps->capacity)
    {
        //单独处理栈空间为空的情况，为空时没法乘于 2，需赋个初始值
        STDataType newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        //防止增容失败，直接申请新变量
        STDataType* tmp = (STDataType* )realloc(ps->arr, newcapacity * sizeof(STDataType));
        //若增容失败，直接退出
        if (tmp == NULL) {
            perror("realloc fail!");
            exit(1);//退出码只要非零即可
        }
        //增容成功，把 tmp 赋给 arr，newcapacity 赋给原 capacity
        ps->arr = tmp;
        ps->capacity = newcapacity;
    }
}
//入栈（尾插）
void StackPush(ST* ps,STDataType x)
{
    //传参不为空
    assert(ps);
    //判断增容
    CheckCapacity(ps);
    //直接插入
    ps->arr[ps->top++] = x;
}
//出栈（尾删）
void StackPop(ST* ps)
{
    assert(ps);//传参不为空
    assert(!STEmpty(ps));//栈空间不为空，才能被删除
    //直接尾删
    ps->top--;
    
}
//判断栈空间是否为空
bool STEmpty(ST* ps)
{
    assert(ps);
    //若栈空间为空，则返回 false。
    return ps->top == 0;
}
//取栈顶元素
STDataType StackTop(ST* ps)
{
    assert(ps);
    assert(!STEmpty(ps));
    return ps->arr[ps->top-1];
}
//返回栈的有效数据
int STSize(ST* ps)
{
    assert(ps);
    return ps->top;
}
